home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1833 / 1833.xpi / modules / yoonoLog.js < prev    next >
Text File  |  2009-12-16  |  9KB  |  257 lines

  1. var EXPORTED_SYMBOLS = ["YOONO_LOG"];
  2.  
  3. try {
  4.  
  5. // Vars
  6. const YOONO_DIR = "yoono";
  7. const YOONO_DEBUG_PREF = "extensions.yoono.debug.level";
  8. const YOONO_DEBUG_WRITE_PREF = "extensions.yoono.debug.write";
  9.  
  10. const LOGFILE_CREATE_PERMISSIONS = 0600;
  11. const LOGFILE_FILE_FLAGS = 0x02 | 0x08 | 0x10; // WRONLY | CREATE_FILE | APPEND
  12.  
  13. // Globals
  14. const CI = Components.interfaces;
  15. const CL = Components.classes;
  16. const PREFSSERVICE = CL["@mozilla.org/preferences-service;1"].getService(CI.nsIPrefService);
  17. const CONSOLESERVICE = CL["@mozilla.org/consoleservice;1"].getService(CI.nsIConsoleService);
  18. const DIRSERVICE = CL['@mozilla.org/file/directory_service;1'].getService(CI.nsIProperties);
  19.  
  20.  
  21. function Log() {
  22.     
  23.     this.wrappedJSObject=this;
  24.     
  25.     var lvl=PREFSSERVICE.QueryInterface(CI.nsIPrefBranch).getIntPref(YOONO_DEBUG_PREF);
  26.     if (lvl && lvl>=0)
  27.         this.level = lvl;
  28.     else
  29.         this.level = 2;
  30.     
  31.     PREFSSERVICE.QueryInterface(CI.nsIPrefBranch2).addObserver(YOONO_DEBUG_PREF, this, false);
  32.     
  33.     var writeToFile=PREFSSERVICE.QueryInterface(CI.nsIPrefBranch).getBoolPref(YOONO_DEBUG_WRITE_PREF);
  34.     
  35.     if (!writeToFile)
  36.         return;
  37.     
  38.     this.logFile = DIRSERVICE.get('ProfDS', CI.nsIFile);
  39.     this.logFile.append(YOONO_DIR);
  40.     try {
  41.         this.logFile.create(CI.nsIFile.DIRECTORY_TYPE,0700);
  42.     } catch(e) {}
  43.     this.logFile.append('yoono.log');
  44.     
  45. }
  46. // with the top <try catch>, we must set constructor after his declaration
  47. const SERVICE_CONSTRUCTOR = Log;
  48.  
  49. Log.prototype.init = function (y) {
  50.   this.rotateLogs();
  51.     this.writeLog(y.utils.dumpDebugInfo());
  52.     
  53. }
  54.  
  55. Log.prototype.rotateLogs = function() {
  56.   // Rotation des logs
  57.   var chemin = null;
  58.   try {
  59.     chemin = DIRSERVICE.get('ProfDS', CI.nsIFile);
  60.     chemin.append(YOONO_DIR);
  61.     if(!chemin.exists()) {
  62.       chemin.create(CI.nsIFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
  63.     }
  64.     var aFile = chemin;
  65.     // Suppression du log le plus ancien
  66.     aFile.append('yoono.log.003');
  67.     if( aFile.exists() ) aFile.remove(true);
  68.     // Rotation
  69.     for(var i=2 ; i>=0 ; i--) {
  70.       chemin = DIRSERVICE.get('ProfDS', CI.nsIFile);
  71.       chemin.append(YOONO_DIR);
  72.       if(0 == i) {
  73.         chemin.append('yoono.log');
  74.       } else {
  75.         chemin.append('yoono.log.00' + i);
  76.       }
  77.       if(chemin.exists()) {
  78.         var newFile = DIRSERVICE.get('ProfDS', CI.nsIFile);
  79.         newFile.append(YOONO_DIR);
  80.         chemin.moveTo(newFile,'yoono.log.00' + (i + 1));
  81.       }
  82.     }
  83.   } catch(err) {CONSOLESERVICE.logStringMessage('Rotation ' + err)}
  84. }
  85. Log.prototype.observe = function(aSubject, aTopic, aData) {
  86.     
  87.     if (aTopic != "nsPref:changed" || aData != YOONO_DEBUG_PREF )
  88.         return;
  89.     this.level = PREFSSERVICE.getIntPref(YOONO_DEBUG_PREF);
  90.     
  91. }
  92.  
  93. Log.prototype.writeLog = function(aOutput){
  94.     if (this.logFile) {
  95.         try {
  96.             var fileOutputStream = CL['@mozilla.org/network/file-output-stream;1'].createInstance(CI.nsIFileOutputStream);
  97.             fileOutputStream.init(this.logFile, LOGFILE_FILE_FLAGS, LOGFILE_CREATE_PERMISSIONS, 0);
  98.             var converter = CL['@mozilla.org/intl/converter-output-stream;1'].createInstance(CI.nsIConverterOutputStream);
  99.             converter.init(fileOutputStream, 'UTF-8', 1024, '-');
  100.             converter.writeString(aOutput);
  101.             converter.flush();
  102.             fileOutputStream.close();
  103.         } catch(err) {CONSOLESERVICE.logStringMessage('Ouverture log "' + this.logFile.path+'" :: '+err)}
  104.     }
  105.     
  106. }
  107.  
  108. var gDate = (new Date()).getTime();
  109.  
  110. Log.prototype.log = function(type, message, file, line) {
  111.     
  112.     // write message in log file
  113.     var msg = ((new Date()).getTime() - gDate) + 'ms, ' + message + "\n";
  114.     // Pretty print file which send this log line
  115.     var location="?";
  116.     if (file) {
  117.         file=file.replace(/\.js$/,"");
  118.     if (file.match(/^chrome:\/\/yoonosb\/content\/js\/services\//)) {
  119.       var file = file.replace(/^chrome:\/\/yoonosb\/content\/js\/services\/(src\/)?/,"");
  120.       location="YServices."+file.split(/\//).join(".");
  121.     } else if (file.match(/^chrome:\/\/yoonosb\/content\/js\//)) {
  122.       var file = file.replace(/^chrome:\/\/yoonosb\/content\/js\//,"");
  123.       //var t = file.split(/\//);
  124.       location="sb::"+file;
  125.     } else if (file.match(/^chrome:\/\/yoonosb\/content\//)) {
  126.       var file = file.replace(/^chrome:\/\/yoonosb\/content\//,"");
  127.       location="widget::"+file;
  128.         } else if (file.match(/^chrome:\/\/yoono/)) {
  129.       var file = file.replace(/^chrome:\/\/yoono\/content\//,"");
  130.             //var t=file.split(/\//);
  131.             location="ext::"+file;
  132.         } else if (file.match(/^file:/)) {
  133.             location="xpcom::"+file.replace(/yoono/,"").replace(/^file.*\//,"");
  134.         } else {
  135.             location=file;
  136.         }
  137.     }
  138.     this.writeLog(type+','+location+':'+line+','+(new Date().toLocaleString())+","+msg);
  139.     return (type+" ["+location+"@"+line+"] "+msg);
  140. }
  141. function stack2string(stack) {
  142.     if (!stack) return "";
  143.     return " - "+stack.filename+"@"+stack.lineNumber+" : \n"+stack2string(stack.caller);
  144. }
  145. Log.prototype.backtrace = function(msg) {
  146.     var caller=Components.stack.caller;
  147.     var message=msg+"\n"+stack2string(caller);
  148.     CONSOLESERVICE.logStringMessage(this.log('debug', message, caller.filename, caller.lineNumber));
  149. }
  150. Log.prototype.debug = function(message, stack) {
  151. try {
  152.     var caller=stack?stack:Components.stack.caller;
  153.     if (this.level>=6) {
  154.         var scriptError = CL["@mozilla.org/scripterror;1"].createInstance(CI.nsIScriptError);
  155.         scriptError.init(this.log('debug', message, caller.filename, caller.lineNumber), caller.filename, null, caller.lineNumber+1, null, scriptError.warningFlag, "");
  156.         CONSOLESERVICE.logMessage(scriptError);
  157.     } else if (this.level>=5) {
  158.         CONSOLESERVICE.logStringMessage(this.log('debug', message, caller.filename, caller.lineNumber));
  159.     }
  160. } catch(e){
  161.     Components.utils.reportError("debug error : "+e);
  162. }
  163. }
  164. Log.prototype.info = function(message, stack) {
  165.     var caller=stack?stack:Components.stack.caller;
  166.     if (this.level>=4) {
  167.         CONSOLESERVICE.logStringMessage(this.log('info', message, caller.filename, caller.lineNumber));
  168.     }
  169. }
  170. Log.prototype.warn = function(message, stack) {
  171.     var caller=stack?stack:Components.stack.caller;
  172.     if (this.level>=3) {
  173.         var scriptError = CL["@mozilla.org/scripterror;1"].createInstance(CI.nsIScriptError);
  174.         scriptError.init(this.log('warning', message, caller.filename, caller.lineNumber), caller.filename, null, caller.lineNumber+1, null, scriptError.warningFlag, "");
  175.         CONSOLESERVICE.logMessage(scriptError);
  176.     }
  177. }
  178. Log.prototype.error = function(message, stack) {
  179.     var caller=stack?stack:Components.stack.caller;
  180.     if (this.level>=2) {
  181.         var scriptError = CL["@mozilla.org/scripterror;1"].createInstance(CI.nsIScriptError);
  182.         scriptError.init(this.log('error', message, caller.filename, caller.lineNumber), caller.filename, null, caller.lineNumber+1, null, scriptError.errorFlag, "");
  183.         CONSOLESERVICE.logMessage(scriptError);
  184.     }
  185. }
  186. Log.prototype.exception = function(exception) {
  187.   var aString = 
  188.                 (typeof exception == "string" ? "message : " + exception + "\n\r\n\r" : "") +
  189.                 (exception.message != null ? "message : " + exception.message + "\n\r\n\r" : "") +
  190.                 (exception.name != null ? "name : " + exception.name + "\n\r\n\r" : "") +
  191.                 (exception.description != null ? "description : " + exception.description + "\n\r\n\r" : "") +
  192.                 ("stack : "+(exception.stack != null ? exception.stack + "\n\r\n\r" : stack2string(Components.stack.caller)) + "\n\r\n\r" );
  193.     var filename=(exception && exception.fileName)?exception.fileName:Components.stack.caller.filename;
  194.     var lineNumber=(exception && exception.lineNumber)?exception.lineNumber:Components.stack.caller.lineNumber;
  195.     if (this.level>=2) {
  196.         var scriptError = CL["@mozilla.org/scripterror;1"].createInstance(CI.nsIScriptError);
  197.         scriptError.init(this.log('exception', aString, filename, lineNumber), filename, null, lineNumber+1, null, scriptError.errorFlag, "");
  198.         CONSOLESERVICE.logMessage(scriptError);
  199.     }
  200. }
  201. Log.prototype.fatal = function(message, stack) {
  202.     var caller=stack?stack:Components.stack.caller;
  203.     if (this.level>=1) {
  204.         var scriptError = CL["@mozilla.org/scripterror;1"].createInstance(CI.nsIScriptError);
  205.         scriptError.init(this.log('fatal', message, caller.filename, caller.lineNumber), caller.filename, null, caller.lineNumber+1, null, scriptError.errorFlag, "");
  206.         CONSOLESERVICE.logMessage(scriptError);
  207.     }
  208. }
  209.  
  210. /**
  211.  * return if Error level is active
  212.  * @method isErrorEnabled
  213.  * @return {Boolean}
  214.  * @type Boolean
  215.  */
  216. Log.prototype.isErrorEnabled = function() {
  217.   return this.level >= 2;
  218. }
  219.  
  220. /**
  221.  * return if warn level is active
  222.  * @method isWarnEnabled
  223.  * @return {Boolean}
  224.  * @type Boolean
  225.  */
  226. Log.prototype.isWarnEnabled = function() {
  227.   return this.level >= 3;
  228. }
  229.  
  230. /**
  231.  * return if info level is active
  232.  * @method isInfoEnabled
  233.  * @return {Boolean}
  234.  * @type Boolean
  235.  */
  236. Log.prototype.isInfoEnabled = function() {
  237.   return this.level >= 4;
  238.  
  239. }
  240.  
  241. /**
  242.  * return if debug level is active
  243.  * @method isDebugEnabled
  244.  * @return {Boolean}
  245.  * @type Boolean
  246.  */
  247. Log.prototype.isDebugEnabled = function() {
  248.   return this.level >= 5;
  249. }
  250.  
  251.  
  252. var YOONO_LOG = new Log();
  253.  
  254. } catch(e) {
  255.     Components.utils.reportError("javascript error in xpcom : "+e);
  256. }
  257.